import router from '@/router'
import { store } from '@/store'
import axios, { AxiosRequestConfig } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus'

// const store = useStore()

const instance = axios.create({
  baseURL: import.meta.env.VITE_API_BASEURL // 基础路径
})

// 请求拦截器
instance.interceptors.request.use(
  config => {
    // 容错：防止请求地址中有空格
    config.url = config.url?.trim()

    // 统一设置用户 token
    const { user } = store.state
    if (user && user.token) {
      config.headers.Authorization = `Bearer ${user.token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 请求锁
let isRefreshing = false
// 响应拦截器
instance.interceptors.response.use(
  response => {
    // 统一处理响应错误，例如 token 无效、服务端异常等
    const { status } = response.data

    // 请求成功
    if (!status || status === 200) return response

    // 登录失效
    if (status === 410000) {
      if (isRefreshing) return Promise.reject(response)

      isRefreshing = true

      ElMessageBox.confirm('您的登录已过期，您可以取消停留在此页面，或确认重新登录', '登录过期', {
        confirmButtonText: '确认',
        cancelButtonText: '取消'
      }).then(() => {
        // 清除用户信息，跳转至首页
        store.commit('setUser', null)
        router.push({
          name: 'login',
          query: { redirect: router.currentRoute.value.fullPath }
        })
      }).finally(() => {
        isRefreshing = false
      })

      return Promise.reject(response)
    }

    // 其它错误给出提示即可，比如 400 参数错误之类的
    ElMessage({
      type: 'error',
      message: response.data.msg,
      duration: 5 * 1000
    })
    return Promise.reject(response)
  },
  err => {
    ElMessage({
      type: 'error',
      message: err.message,
      duration: 5 * 1000
    })
    return Promise.reject(err)
  }
)

// 将request作为函数导出

export interface ResponseType<T = any> {
  code: number;
  data: T;
}

export default async <T>(config: AxiosRequestConfig) => {
  const { data } = await instance.request<ResponseType<T>>(config)
  return data.data || data
}
